"""
从上述例子我们可以看到，except 是不管 try的代码发生什么异常，都会触发这个关键字
但是我们更多的时候，只要捕获 特定的异常
这是为什么？因为我们要让程序变得更加可控。
打个比方，你使用 except 捕获到了一种异常，并将其处理。
但是在未来的某一天，你的程序又发生了另一种异常，但是由于你使用了 except，你会将这另一种异常当作之前的异常来看待
但实际上它们两造成的影响/结果都有可能大大的不同。
"""
# def maybeError(valueDict):
#     try:
#         print(f"你传入的字典没有问题，岁数：{int(valueDict['age'])}")
#     except:
#         print(f"你传入的字典中的岁数不太对啊，不是个正常的字符串数字 {valueDict}")
#
#
# print("first execute:")
# maybeError({'age': '1b'})
# print("\nsecond execute:")
# maybeError({})

# 结果
"""
first execute:
你传入的字典中的岁数不太对啊，不是个正常的字符串数字 {'age': '1b'}

second execute:
你传入的字典中的岁数不太对啊，不是个正常的字符串数字 {}
"""

#
# def maybeError(valueDict):
#     try:
#         print(f"你传入的字典没有问题，岁数：{int(valueDict['age'])}")
#     except ValueError:
#         print(f"你传入的字典中的岁数不太对啊，不是个正常的字符串数字 {valueDict}")
#     except KeyError:
#         print(f"你传入的字典中没有 岁数 字段 {valueDict}")
#     except:
#         print(f"程序发生了未知异常")
#
#
# print("first execute:")
# maybeError({'age': '1b'})
# print("\nsecond execute:")
# maybeError({})
"""
异常捕获 也是多分支的，和 if...elif... 一样，由上到下，捕获到一种异常后，即不会运行以下的 except。
想想也是，同一时间肯定只有一种异常会触发。
"""

# 查看异常信息

"""
我们上面的做法，只是针对某些异常做出处理，但是更多的时候，我们使用 try 是为了定位程序中有没有可能发生某些异常

但是我们使用了 except ，目前来说，我们就看不到异常是啥了。

这个时候，python的标准库 traceback 就排上用场了。

traceback会记录所有异常信息到程序内部，等待你调用它的时候才会给你输出
"""
# import traceback
#
# try:
#     int('a')
# except:
#     i= traceback.print_exc()    # 打印异常信息, 直接输出到控制台
#     error = traceback.format_exc()    # 返回异常信息，可以用一个变量接住它，或者直接使用
#     print("代码异常信息：\n",error)
#
# print("123")